home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / stdio / RCS / setvbuf.c,v < prev    next >
Text File  |  1991-12-02  |  5KB  |  201 lines

  1. head     1.4;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.4.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.4
  10. date     89.06.19.14.15.14;  author jhh;  state Exp;
  11. branches 1.4.1.1;
  12. next     1.3;
  13.  
  14. 1.3
  15. date     88.07.25.13.12.57;  author ouster;  state Exp;
  16. branches ;
  17. next     1.2;
  18.  
  19. 1.2
  20. date     88.06.27.11.20.57;  author ouster;  state Exp;
  21. branches ;
  22. next     1.1;
  23.  
  24. 1.1
  25. date     88.06.10.16.24.00;  author ouster;  state Exp;
  26. branches ;
  27. next     ;
  28.  
  29. 1.4.1.1
  30. date     91.12.02.20.02.43;  author kupfer;  state Exp;
  31. branches ;
  32. next     ;
  33.  
  34.  
  35. desc
  36. @@
  37.  
  38.  
  39. 1.4
  40. log
  41. @Made stderr buffer static
  42. @
  43. text
  44. @/* 
  45.  * setvbuf.c --
  46.  *
  47.  *    Source code for the "setvbuf" library procedure.
  48.  *
  49.  * Copyright 1988 Regents of the University of California
  50.  * Permission to use, copy, modify, and distribute this
  51.  * software and its documentation for any purpose and without
  52.  * fee is hereby granted, provided that the above copyright
  53.  * notice appear in all copies.  The University of California
  54.  * makes no representations about the suitability of this
  55.  * software for any purpose.  It is provided "as is" without
  56.  * express or implied warranty.
  57.  */
  58.  
  59. #ifndef lint
  60. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/setvbuf.c,v 1.3 88/07/25 13:12:57 ouster Exp Locker: jhh $ SPRITE (Berkeley)";
  61. #endif not lint
  62.  
  63. #include <stdio.h>
  64. #include <stdlib.h>
  65. #include "fileInt.h"
  66.  
  67. /*
  68.  *----------------------------------------------------------------------
  69.  *
  70.  * setvbuf --
  71.  *
  72.  *    This procedure may be used to amount of buffering used for
  73.  *    a stdio stream.  A buffer size of 0 or 1, or a mode of _IONBF,
  74.  *    means the stream is unbuffered: each byte of I/O results in a
  75.  *    system call.  Needless to say, this is likely to be inefficient.
  76.  *    A buffer size of N means that N characters are read from the
  77.  *    system at a time, regardless of how many are actually needed,
  78.  *    and on writes, nothing is written to the system until N bytes
  79.  *    have accumulated, at which point all are written in one operation.
  80.  *
  81.  * Results:
  82.  *    Returns 0 on success, -1 if there was an error in the arguments
  83.  *    or if buffer space couldn't be setup properly.
  84.  *
  85.  * Side effects:
  86.  *    The stream is modified to use size bytes of buffering.
  87.  *    Old buffer space is returned to the storage allocator, if it
  88.  *    was allocated by stdio rather than the client.
  89.  *
  90.  *----------------------------------------------------------------------
  91.  */
  92.  
  93. int
  94. setvbuf(stream, buf, mode, size)
  95.     register FILE *stream;    /* Stream whose buffering is to be changed. */
  96.     char *buf;            /* Buffer to use for stream. */
  97.     int mode;            /* Mode for buffering:  _IOFBF, _IOLBF, or
  98.                  * _IONBF. */
  99.     int size;            /* Number of characters of space in buffer;
  100.                  * 0 or 1 means unbuffered. */
  101. {
  102.     int result;
  103.  
  104.     if (stream->readProc != (void (*)()) StdioFileReadProc) {
  105.     return -1;
  106.     }
  107.  
  108.     result = fflush(stream);
  109.  
  110.     /*
  111.      * Careful!  Don't free the statically-allocated buffers for
  112.      * standard streams.
  113.      */
  114.  
  115.     if ((stream->buffer != stdioTempBuffer)
  116.         && (stream->buffer != stdioStderrBuffer)
  117.         && (stream->buffer != NULL)
  118.         && !(stream->flags & STDIO_NOT_OUR_BUF)) {
  119.     free((char *) stream->buffer);
  120.     }
  121.     stream->flags &= ~(STDIO_LINEBUF|STDIO_NOT_OUR_BUF);
  122.  
  123.     if (size < 1) {
  124.     size = 1;
  125.     }
  126.     if (mode == _IONBF) {
  127.     size = 1;
  128.     } else if (mode == _IOLBF) {
  129.     stream->flags |= STDIO_LINEBUF;
  130.     } else if (mode != _IOFBF) {
  131.     return -1;
  132.     }
  133.  
  134.     if (buf != 0) {
  135.     stream->buffer = (unsigned char *) buf;
  136.     stream->flags |= STDIO_NOT_OUR_BUF;
  137.     } else {
  138.     stream->buffer = (unsigned char *) malloc((unsigned) size);
  139.     }
  140.     stream->bufSize = size;
  141.     stream->lastAccess = stream->buffer - 1;
  142.     stream->readCount = 0;
  143.     stream->writeCount = 0;
  144.     return result;
  145. }
  146. @
  147.  
  148.  
  149. 1.4.1.1
  150. log
  151. @Initial branch for Sprite server.
  152. @
  153. text
  154. @d17 1
  155. a17 1
  156. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/setvbuf.c,v 1.4 89/06/19 14:15:14 jhh Exp $ SPRITE (Berkeley)";
  157. @
  158.  
  159.  
  160. 1.3
  161. log
  162. @Lint.
  163. @
  164. text
  165. @d17 1
  166. a17 1
  167. static char rcsid[] = "$Header: setvbuf.c,v 1.2 88/06/27 11:20:57 ouster Exp $ SPRITE (Berkeley)";
  168. d73 1
  169. @
  170.  
  171.  
  172. 1.2
  173. log
  174. @Was freeing buffers it shouldn't.
  175. @
  176. text
  177. @d17 1
  178. a17 1
  179. static char rcsid[] = "$Header: setvbuf.c,v 1.1 88/06/10 16:24:00 ouster Exp $ SPRITE (Berkeley)";
  180. d20 2
  181. a21 1
  182. #include "stdio.h"
  183. @
  184.  
  185.  
  186. 1.1
  187. log
  188. @Initial revision
  189. @
  190. text
  191. @d17 1
  192. a17 1
  193. static char rcsid[] = "$Header: atoi.c,v 1.1 88/04/28 17:20:23 ouster Exp $ SPRITE (Berkeley)";
  194. d21 1
  195. d60 4
  196. d71 4
  197. a74 2
  198.     if ((stream->flags & STDIO_NOT_OUR_BUF) == 0) {
  199.         free((char *) stream->buffer);
  200. @
  201.